package com.excilys.formation.project.services.impl;

import static org.springframework.util.Assert.isTrue;

import java.util.SortedSet;

import org.joda.time.Interval;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.excilys.formation.project.entities.Compte;
import com.excilys.formation.project.entities.Operation;
import com.excilys.formation.project.entities.Transaction;
import com.excilys.formation.project.entities.TypeOperation;
import com.excilys.formation.project.repository.CompteDAO;
import com.excilys.formation.project.repository.OperationDAO;
import com.excilys.formation.project.repository.TransactionDAO;
import com.excilys.formation.project.services.TransactionService;

/**
 * 
 * @author excilys
 * 
 */
@Service
public class TransactionServiceImpl implements TransactionService {

	/**
	 * DAO des transactions pour persister les changements.
	 */
	@Autowired
	TransactionDAO transactionDAO;

	/**
	 * DAO des opérations pour persister les changements.
	 */
	@Autowired
	OperationDAO operationDAO;

	/**
	 * DAO des comptes pour persister les changements.
	 */
	@Autowired
	CompteDAO compteDAO;

	@Override
	public void creerVirement(Compte emetteur, Compte recepteur, double montant) {
		isTrue(montant > 0, "Le montant devrait être strictement positif");
		isTrue(!emetteur.getNumero().equals(recepteur.getNumero()), "Les comptes doivent être différents");

		Transaction transaction = new Transaction();
		Operation emission = new Operation();
		Operation reception = new Operation();

		emetteur.setSolde(emetteur.getSolde() - montant);
		recepteur.setSolde(recepteur.getSolde() + montant);

		emission.setCompte(emetteur);
		emission.setMontant(montant);
		emission.setType(TypeOperation.VIREMENT);

		reception.setCompte(recepteur);
		reception.setMontant(montant);
		reception.setType(TypeOperation.VIREMENT);

		compteDAO.save(emetteur);
		compteDAO.save(recepteur);

		transactionDAO.save(transaction);
		operationDAO.save(emission);
		operationDAO.save(reception);
	}

	@Override
	public SortedSet<Transaction> getVirementsEmisByClientByTimeInterval(long clientId, Interval interval) {
		return transactionDAO.getVirementsEmisByClientByTimeInterval(clientId, interval);
	}
}
